package com.waikuai.shop.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.waikuai.shop.dto.CardExchangeRequest;
import com.waikuai.shop.dto.WelfareCardQueryDTO;
import com.waikuai.shop.entity.WelfareCard;
import com.waikuai.shop.entity.User;

import java.math.BigDecimal;
import java.util.List;

/**
 * 额度卡服务接口
 * @author waikuai
 */
public interface WelfareCardService extends IService<WelfareCard> {

    /**
     * 验证卡密并兑换到账户余额
     * @param request 兑换请求
     * @param userId 用户ID
     * @return 兑换结果（包含到账金额与最新余额）
     */
    com.waikuai.shop.vo.ExchangeResultVO exchangeCard(CardExchangeRequest request, Long userId);

    /**
     * 获取用户的额度卡列表
     * @param userId 用户ID
     * @param status 卡状态
     * @return 额度卡列表
     */
    List<WelfareCard> getUserCards(Long userId, Integer status);

    /**
     * 分页查询额度卡列表
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<WelfareCard> getCardPage(WelfareCardQueryDTO queryDTO);

    /**
     * 根据卡号查询额度卡
     * @param cardNumber 卡号
     * @return 额度卡信息
     */
    WelfareCard getByCardNumber(String cardNumber);

    /**
     * 根据卡号和卡密查询额度卡
     * @param cardNumber 卡号
     * @param cardPassword 卡密
     * @return 额度卡信息
     */
    WelfareCard getByCardNumberAndPassword(String cardNumber, String cardPassword);

    /**
     * 统计用户可用额度卡总额
     * @param userId 用户ID
     * @return 总金额
     */
    BigDecimal sumAvailableAmountByUserId(Long userId);

    /**
     * 统计各状态的额度卡数量
     * @param status 状态
     * @return 数量
     */
    Integer countCardsByStatus(Integer status);

    /**
     * 获取即将过期的额度卡列表
     * @param days 天数
     * @return 额度卡列表
     */
    List<WelfareCard> getCardsExpiringSoon(Integer days);

    /**
     * 批量生成额度卡
     * @param amount 面额
     * @param quantity 数量
     * @param expireDays 过期天数
     * @param batchNo 批次号
     * @return 生成结果
     */
    boolean batchGenerateCards(BigDecimal amount, Integer quantity, Integer expireDays, String batchNo);

    /**
     * 批量发放额度卡
     * @param cardIds 卡ID列表
     * @param userId 用户ID
     * @return 发放结果
     */
    boolean batchIssueCards(List<Long> cardIds, Long userId);

    /**
     * 批量更新额度卡状态
     * @param cardIds 卡ID列表
     * @param status 新状态
     * @return 更新结果
     */
    boolean updateCardStatusBatch(List<Long> cardIds, Integer status);

    /**
     * 根据批次号查询额度卡
     * @param batchNo 批次号
     * @return 额度卡列表
     */
    List<WelfareCard> getCardsByBatchNo(String batchNo);

    /**
     * 检查额度卡是否可用
     * @param cardNumber 卡号
     * @param cardPassword 卡密
     * @return 是否可用
     */
    boolean checkCardAvailable(String cardNumber, String cardPassword);

    /**
     * 验证额度卡
     * @param cardNumber 卡号
     * @param cardPassword 卡密
     * @return 额度卡信息（如果验证失败返回null）
     */
    WelfareCard validateCard(String cardNumber, String cardPassword);

    /**
     * 兑换额度卡到用户余额
     * @param card 额度卡
     * @param user 用户
     * @return 兑换结果
     */
    boolean redeemCardToBalance(WelfareCard card, User user);

    /**
     * Excel导入并批量发放额度卡
     * @param file Excel文件
     * @return 发放结果
     */
    com.waikuai.shop.vo.CardIssueResultVO importAndIssueCards(org.springframework.web.multipart.MultipartFile file);

    /**
     * 多选员工批量发放额度卡
     * @param userIds 员工ID列表
     * @param amount 单张卡面额
     * @param countPerUser 每人发放张数
     * @return 发放结果
     */
    com.waikuai.shop.vo.CardIssueResultVO batchIssueToUsers(java.util.List<Long> userIds, BigDecimal amount, Integer countPerUser);

    /**
     * 查询未发放的额度卡（按批次号）
     * @param batchNo 批次号
     * @return 额度卡列表
     */
    List<WelfareCard> getUnissuedCardsByBatch(String batchNo);

    /**
     * 获取员工的额度卡详情（包含完整卡号密码）
     * @param userId 用户ID
     * @param status 状态
     * @return 额度卡列表
     */
    List<WelfareCard> getMyCardsWithCredentials(Long userId, Integer status);

    /**
     * 下载Excel模板
     * @param response HTTP响应
     */
    void downloadTemplate(javax.servlet.http.HttpServletResponse response);

    /**
     * 自动兑换用户的所有已发放额度卡
     * @param userId 用户ID
     * @return 兑换结果（包含成功数量和总金额）
     */
    com.waikuai.shop.vo.AutoRedeemResultVO autoRedeemIssuedCards(Long userId);
}